home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / disk / misc / Mtools207.lha / Mtools-2.0.7 / src / buf_read.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-27  |  2.2 KB  |  98 lines

  1. /*
  2.  * Do full cylinder buffered reads from slow devices.  Uses a simple
  3.  * buffered read/delayed write algorithm.
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "msdos.h"
  8. #include "amiga_devices.h"
  9.  
  10. extern struct device_data * ddata;
  11.  
  12. unsigned char *disk_buf;        /* disk read/write buffer */
  13. int disk_size;                /* size of read/write buffer */
  14. long disk_current;            /* first sector in buffer */
  15. int disk_dirty;                /* is the buffer dirty? */
  16.  
  17. extern int fd;
  18. extern long disk_offset;
  19.  
  20. void
  21. disk_read(start, buf, len)
  22. long start;
  23. unsigned char *buf;
  24. int len;
  25. {
  26.     register long i;
  27.     int length;
  28.     unsigned char *buf_ptr, *disk_ptr;
  29.     char *memcpy();
  30.     long where, tail, lseek();
  31.     void perror(), exit(), disk_flush();
  32.  
  33.     
  34.                     /* don't use cache? */
  35.     if (disk_size == 1) {
  36.         where = (start * MSECTOR_SIZE) + disk_offset; 
  37.         
  38.         
  39.         if (ddata != 0) {
  40.             if (len != (int) device_read( ddata, (ulong) where, (ulong) len, buf) ) {
  41.                 perror("disk_read: read");
  42.                 exit(1);
  43.             }
  44.         }
  45.         else {
  46.             if (lseek(fd, where, 0) < 0) {
  47.                 perror("disk_read: lseek");
  48.                 exit(1);
  49.             }
  50.                         /* read it! */
  51.             if (read(fd, (char *) buf, (unsigned int) len) != len) {
  52.                 perror("disk_read: read");
  53.                 exit(1);
  54.             }
  55.         }
  56.         return;
  57.     }
  58.  
  59.     tail = start + (len / MSECTOR_SIZE) - 1;
  60.     for (i = start; i <= tail; i++) {
  61.                     /* a "cache" miss */
  62.         if (i < disk_current || i >= disk_current + disk_size) {
  63.  
  64.             if (disk_dirty)
  65.                 disk_flush();
  66.  
  67.             disk_current = (i / disk_size) * disk_size;
  68.             where = (disk_current * MSECTOR_SIZE) + disk_offset;
  69.             length = disk_size * MSECTOR_SIZE;
  70.  
  71. /* printf ("read it where: %d len: %d\n", where, length); */
  72.             if (ddata != 0) {
  73.                 if (length != (int) device_read( ddata, (ulong) where, (ulong) length, disk_buf) ) {
  74.                     perror("disk_read: read");
  75.                     exit(1);
  76.                 }
  77.             }
  78.             else {
  79.                         /* move to next location */
  80.                 if (lseek(fd, where, 0) < 0) {
  81.                     perror("disk_read: lseek");
  82.                     exit(1);
  83.                 }
  84.                     /* read it! */
  85.                 if (read(fd, (char *) disk_buf, (unsigned int) length) != length) {
  86.                     perror("disk_read: read");
  87.                     exit(1);
  88.                 }
  89.             }
  90.         }
  91.                     /* a cache hit... */
  92.         buf_ptr = buf + ((i - start) * MSECTOR_SIZE);
  93.         disk_ptr = disk_buf + ((i - disk_current) * MSECTOR_SIZE);
  94.         memcpy((char *) buf_ptr, (char *) disk_ptr, MSECTOR_SIZE);
  95.     }
  96.     return;
  97. }
  98.